#include "stdafx.h"
#include "Align.h"
#include "TextMetrics.h"
#include "WindowMetrics.h"
#include "AlignStrategy.h"
#include "NoAlign.h"
#include "AlignByLetter.h"
#include "AlignByMix.h"
#include "AlignByWord.h"


/////////////////////////////////////////////////////////////////
//
// interface
//
///////////////////////////////////////////////////////////////////
bool Align::IsRowLongerThanScreen(wstring& str)
{
	return align->IsRowLongerThanScreen(str, wm->GetFormattingWidth());
}

int Align::FindCuttingPoint(wstring& str)
{
	return align->FindCuttingPoint(str, wm->GetFormattingWidth());
}

bool Align::IsSpaceAvailable(wstring& rowStr, wstring& concatenatingStr)
{
	return (wm->GetFormattingWidth() - tm->CalcStringLength(rowStr)) > 
		tm->CalcStringLength(concatenatingStr);
}

//////////////////////////////////////////////////////////////////
//
// Getters and Setters
//
/////////////////////////////////////////////////////////////////
void Align::SetAlignStyle(AlignStyle style)
{
	this->style = style;

	delete align;

	switch(style)
	{
	case NO_ALIGN:
		align = new NoAlign(tm);
		break;
	case BY_LETTER:
		align = new AlignByLetter(tm);
		break;
	case BY_MIX:
		align = new AlignByMix(tm);
		break;
	case BY_WORD:
		align = new AlignByWord(tm);
		break;
	}
}

AlignStyle Align::GetAlignStyle()
{
	return style;
}

////////////////////////////////////////////////////////////////////
//
// Constructors and Destructors
//
////////////////////////////////////////////////////////////////////
Align::Align(void)
{
}

Align::~Align(void)
{
}

void Align::Init(TextMetrics* textMetrics, WindowMetrics* wm)
{
	tm = textMetrics;
	this->wm = wm;

	style = BY_MIX;
	align = new AlignByMix(tm);
}
